package com.zwh.se.io.net.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 可以发现UDP即便在接收方没有开启服务的情况下,发送方依旧是可以发送消息的,只是接收方没法接收到罢了
 * 这也是UDP不保证可靠性的一种表现,它只负责发送,不会去在意消息是否能确实地传达
 */
public class Receive {
    public static void main(String[] args) throws Exception {
        //创建socket套接字,指定接收方的端口
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        //准备一个空的数据包,用来接收对方传过来的数据包：
        byte[] buffer = new byte[1024];//故意将缓冲区设小点来看效果
        DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);
        //接收对方的数据包，然后放入我们的datagramPacket数据包中填充
        //同tcp的socket一样,调用该方法后会堵塞直至有内容可读出为止
        datagramSocket.receive(datagramPacket);//接收完以后 datagramPacket里面就填充好内容了
        //取出数据包中的数据
        byte[] data = datagramPacket.getData();
        //将取出的数据转换为字符串
        //datagramPacket.getLength() 数组包中的有效长度(由于故意设小了所以最大也只能达到10个字节)
        String msg = new String(data, 0, datagramPacket.getLength());
        System.out.println("发送方向我发送了一个这样的消息：" + msg);
        //数据包接收到信息时,会将发送方的信息也存入进去,可以通过从里面取出相关信息来做出应答
        datagramSocket.send(new DatagramPacket(msg.getBytes(), msg.getBytes().length, datagramPacket.getAddress(), datagramPacket.getPort()));
        //关闭资源
        datagramSocket.close();
    }

}
